<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ECMA测试</title>
  </head>
  <body>
    <script>
      //  1.  Javascript 的数据类型有几种？分别又有哪些类型？（5）
      // Number\String\Boolean\null\undefined
      // Object\Array\Function
      // 这8种数据类型又分为基本类型和引用类型。
      // 引用类型有object，sysmbol，bigint；基本类型包括number，string，boolean，null，undefined。

      //  2.  return 有那两个作用？ 构造函数里return会怎么样？（5）

      // 1.作为返回值，返回一个类型的值
      // 2.结束方法的运行

      //  在构造函数
      // 1.当return一个基本类型时，return不会发生作用，构造函数依旧返回一个实例对象。
      //2. 当return一个引用类型时，return会覆盖创建实例，构造函数返回自己手写的引用类型值
      // 3.当只使用return时，return只会终止代码执行。依旧返回一个创建的实例

      //  3.  undefined 和 null 的区别？什么时候会得到undefined？（5）
      //  null：表示空值，空对象（空指针）
      // undefined：表示定义了，但是没有赋值
      //  4.  使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      // continue：表示跳过当前这一次循环，直接进入下一次循环
      // break：表示直接终止当前整个循环

      //  5.  如何判断字符串内是否包含指定字符？（5）
      // indexOf
      // lastIndexOf
      // includes

      //  6. 值传递和引用传递的区别？ （5）
      // 原始数据类型按值进行比较。如果两个值相同，则它们严格相等。
      // 函数参数为基本数据类型时，函数体内赋值了一份参数值，任何操作都不会影响原参数的实际值
      // 函数参数是引用类型时，当函数体内修改这个值的某个属性时，将会对原来的参数进行修改
      // 函数参数是引用类型时，如果直接修改这个值的引用地址，则相当于在函数体内新创建了一个新的引用，任何操作都不会影响原参数的实际值。

      //  7. 请尽量列举出数组的方法,并注明其作用以及会不会修改原数组，至少10种（10）
      //       会修改原数组：push、pop、shift、unshift、splice、reverse、sort
      // 不会修改原数组：forEach、reduce、filter、concat、join、slice、map、some、every、

      //  8.  请写出以下输出的结果和原因；（10）
      var bar = true,
        number = 0;
      console.log(bar + 0); //1             隐式转换
      console.log(bar + 'xyz'); //truexyz   字符串的拼接
      console.log(bar + true); // 2         隐式转换
      console.log(+true); //1               加1
      console.log(!'bluej'); //false       取反就是false
      console.log(number++); //0           后置增加 先运算
      console.log(++number); //2           前置增加  先++
      console.log(number); //2        number是2
      10 > 20 || console.log('haha'); //haha 10部不大于20，所以打印后面的haha  遇真短路
      10 > 20 && console.log('haha'); // 空 ，10不大于20 直接短路了。 遇假短路

      //  9. 将多个数组进合并后再去重；对于去重的方案要求3种及以上（10）
      // var arr1 = [1, 2, 3],
      //   arr2 = [2, 3, 4, 5];
      // 第一种
      // var arr3 = [];
      // arr3 = arr1.concat(arr2);
      // arr3 = arr3.filter(function (item, index) {
      //   return arr3.indexOf(item) == index;
      // });
      // console.log(arr3);
      // 第二种
      // let arr4 = [...new Set(arr3)];
      // console.log(arr4);
      // 第三种
      // var arr3 = arr3.sort(function (a, b) {
      //   return a - b;
      // });
      // for (var i = 0; i < arr3.length; i++) {
      //   if (arr3[i] == arr3[i + 1]) {
      //     arr3.splice(i, 1);
      //     i--;
      //   }
      // }
      // console.log(arr3);

      //10.将 str="再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！"里面的所有"燕子"替换成"jack"不要用replaceAll(10)

      //   var str =
      //     '再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧'
      //  var n = str.replace(/燕子/gi,'jack');
      //  console.log(n);

      //11. 找出数组中年龄小于18岁的女生(girl)的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      // var arr3 = [
      //   { name: '彭于晏', sex: 'boy', age: 18, count: 20 },
      //   { name: '迪丽热巴', sex: 'girl', age: 17, count: 30 },
      //   { name: '吴彦祖', sex: 'boy', age: 16, count: 40 },
      //   { name: '古力娜扎', sex: 'girl', age: 15, count: 50 },
      //   { name: '刘德华', sex: 'boy', age: 20, count: 60 },
      //   { name: '刘亦菲', sex: 'girl', age: 13, count: 70 },
      //   { name: '张学友', sex: 'boy', age: 14, count: 80 },
      // ];

      // let newArr = [];
      // var newArr = arr3.filter(function (item) {
      //   return item.age < 18;
      // }, 0);
      // console.log(newArr);
      // var res = newArr.map(function (item) {
      //   return item.count * item.count;
      // });
      // console.log(res);

      // 12. 统计字符串'abbcccddddd'中每个字符出现的次数，统计数组['a','b','b','c','c','c','d','d','d','d','d'中每个字符出现的次数(10分)

      let string = 'abbcccddddd';
      let obj = {};
      for (let char of string) {
        obj[char] = (obj[char] || 0) + 1;
      }
      console.log(obj);

      var arr1 = ['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd'];
      var res = arr1.reduce(function (prev, item) {
        prev[item] = prev[item] + 1 || 1;
        return prev;
      }, {});
      console.log(res);
    </script>
  </body>
</html>
